package ru.spb.nicetu.altx.mnemo.node.factory;

import java.util.ArrayList;
import java.util.List;

import ru.spb.nicetu.altx.mnemo.cell.INodeCell;
import ru.spb.nicetu.altx.mnemo.cell.INodeCell.Categories;
import ru.spb.nicetu.altx.mnemo.node.INode;

public abstract class ANodeFactory implements INodeFactory {
  private String name;
  private List<INodeCell> inputNodeCells = new ArrayList<INodeCell>();
  private List<INodeCell> outputNodeCells = new ArrayList<INodeCell>();
  private List<INodeCell> settingNodeCells = new ArrayList<INodeCell>();

  
  public INode createInstance() {
    String name = this.getName();

    /**
     * создание объекта NODE-а - реализуется в конкретных потомках фабрики.
     */
    INode node = createNode(name);

    // Копируем поля из фабрики в NODE.
    node.setConcreteName(name);

    for (INodeCell cell : this.getAllInputCells()) {
      node.addNodeCell(cell.clone());
    }
    for (INodeCell cell : this.getAllOutputCells()) {
      node.addNodeCell(cell.clone());
    }
    for (INodeCell cell : this.getAllSettingCells()) {
      node.addNodeCell(cell.clone());
    }
    return node;
  }

  
  public void addNodeCell(INodeCell cell) {
    if (cell == null)
      return;

    if (cell.getCategorie() == Categories.INPUT)
      inputNodeCells.add(cell);
    else if (cell.getCategorie() == Categories.OUTPUT)
      outputNodeCells.add(cell);
    else if (cell.getCategorie() == Categories.SETTING)
      settingNodeCells.add(cell);
  }

  
  public List<INodeCell> getAllInputCells() {
    return inputNodeCells;
  }

  
  public List<INodeCell> getAllOutputCells() {
    return outputNodeCells;
  }

  
  public List<INodeCell> getAllSettingCells() {
    return settingNodeCells;
  }

  
  public String getName() {
    return name;
  }

  
  public void setName(String name) {
    this.name = name;
  }

  abstract protected INode createNode(String name);
}
